# = StarFrame::Eventable -- イベント

module StarFrame
  # = Eventableモジュール
  # イベント駆動を実装するモジュール。
  # 
  # 初期化時、終了時、更新時、描画時の処理をメソッド定義として記述できるようになる。
  # 
  # また、メソッドチェインを利用して各イベントの前後に他の処理を割り込ませることができる。
  module Eventable
    # 初期化時イベントをコールする。
    def call_init *args
      init *args
    end
    # 終了時イベントをコールする。
    def call_quit
      quit
    end
    # 更新時イベントをコールする。
    def call_update
      update
    end
    # 描画時イベントをコールする。
    def call_render
      render
    end
    
    # 実行する。
    # 
    # call_updateと同様です。
    # 
    # このメソッドは、procとのダックタイピング用に用意されています。
    def call
      call_update
    end
    
    private
    # 初期化時にコールされるイベント。
    def init *args
      #:doc:
    end
    # 終了時にコールされるイベント。
    def quit
      #:doc:
    end
    # 更新時にコールされるイベント。
    def update
      #:doc:
    end
    # 描画時にコールされるイベント。
    def render
      #:doc:
    end
    
    def self.included klass #:nodoc:
      klass.extend ClassMethods
    end
    
    # = Eventable::ClassMethods
    # Eventableモジュールをincludeすることで追加されるクラスメソッド
    module ClassMethods
      # メソッドチェインを作成する。
      # 
      # 各種イベントの発生時に別のメソッドを呼ばせることができる。
      def alias_method_chain target, feature
        alias_method "#{target}_without_#{feature}", target
        alias_method target, "#{target}_with_#{feature}"
      end
    end
  end
end
